package src.main.kotlin.day09


/**
 * 密封类
 *  对于更复杂的枚举等，实现更复杂的定义，密封类可以用来定义一个类似于枚举类的ADT
 *  但可以更灵活的控制某一个类型（类似可以赋值，可以执行逻辑等），
 *  密封类可以有若干个子类，要继承密封类，这些子类必须和他定义在同一个文件中
 */
fun main() {
    val driver = Driver2(LicenseStatus2.LEARNING)
    val driver2 = Driver2(LicenseStatus2.QUALIFIED("85846287462874"))
    println(driver.checkLicense())
    println(driver2.checkLicense())
}

/**
 * 密封
 */
sealed class LicenseStatus2{
    //object 单例 没有状态 没有属性
    object UNQUALIFIED:LicenseStatus2()

    object LEARNING:LicenseStatus2()
    class QUALIFIED(val licenseId:String) : LicenseStatus2()
}

class Driver2(private var status:LicenseStatus2){
    fun checkLicense():String{
        //不使用else语句，编译器可以帮助检查代码处理是否有遗漏
        return when(status){
            is LicenseStatus2.UNQUALIFIED -> "没资格"
            is LicenseStatus2.LEARNING -> "在学"
            is LicenseStatus2.QUALIFIED ->
                "有资格，驾驶证编号：${(this.status as LicenseStatus2.QUALIFIED).licenseId}"
            else->"未知"
        }

    }
}

